package com.itheima.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * MP的一些常用注解:
 * 1.@TableName:用于实体类指定表名,MP将不再根据实体类名推断表名
 * 2.@TableId:用于为属性指定主键字段名,还可以指定主键值生成策略
 *     主键生成策略：当调用Mapper执行插入时，MP将如何处理主键值
 *     有以下几种：
 *       IdType:Auto: ❤使用数据库主键自增
 *
 *       IdType.ASSIGN_ID: ❤使用分配Id，默认雪花算法，将来学到分布式数据库(分库分表)时会使用(微服务阶段)；
 *          MP将会采用雪花算法生成一个Long数字作为主键值
 *       IdType.ASSIGN_UUID：[用的不多] 使用分配UUID,生成一个随机字符串,32个十六禁止的字符长度
 *
 *       IdType.NONE:不设置，跟随全局策略
 *       IdType.INPUT:  ❤必须由Java程序提供好主键值，
 *
 * 3.@TableField:用于为属性指定非主键字段名
 *   什么样的字段必须要添加此注解进行手动设置呢？
 *    第1种:属性名和字段名  不同且不符合映射规则
 *    第2种：属性名是isXXX, 不同版本MP处理方式不同,可能对应不上字段名
 *    第3种:属性名是SQL语句里的关键字，需要设置字段名为 '字段名' ，加反引号的目的是告诉SQl这不是个关键字
 *    第4种：如果属性没有对应的字段。需要加@TableField(exist = false)
 *
 *
 * @author liuyp
 * @since 2025/8/6
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_user")
public class User {
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    @TableField(value = "username")
    private String uname;
    @TableField(value = "is_married")
    private Boolean isMarried;
    @TableField(value = "`order`")
    private Integer order;
    @TableField(exist = false)
    private String address;
}
